package com.ssd.service.impl;

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import com.ssd.api.payment.dto.enums.PayChannelEnum;
import com.ssd.config.QRCodeConfig;
import com.ssd.service.QRCodeService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * QRCodeServiceImpl类实现QRCodeService接口，提供生成二维码的功能
 * 主要根据不同的支付渠道生成带有logo的二维码图片，并以Base64编码字符串的形式返回
 */
@Service
public class QRCodeServiceImpl implements QRCodeService {

    @Resource
    private QRCodeConfig qrCodeConfig;

    /**
     * 根据内容和支付渠道生成二维码图片并以Base64编码字符串的形式返回
     *
     * @param content 二维码包含的内容
     * @param payChannel 支付渠道，用于选择相应的logo图片
     * @return 二维码的Base64编码字符串
     */
    @Override
    public String generate(String content, PayChannelEnum payChannel) {
        QrConfig qrConfig = new QrConfig();
        //设置边距
        qrConfig.setMargin(this.qrCodeConfig.getMargin());
        //二维码颜色
        qrConfig.setForeColor(HexUtil.decodeColor(this.qrCodeConfig.getForeColor()));
        //设置背景色
        qrConfig.setBackColor(HexUtil.decodeColor(this.qrCodeConfig.getBackColor()));
        //纠错级别
        qrConfig.setErrorCorrection(ErrorCorrectionLevel.valueOf(this.qrCodeConfig.getErrorCorrectionLevel()));
        //设置宽
        qrConfig.setWidth(this.qrCodeConfig.getWidth());
        //设置高
        qrConfig.setHeight(this.qrCodeConfig.getHeight());
        if (ObjectUtil.isNotEmpty(payChannel)) {
            //设置logo
            qrConfig.setImg(this.qrCodeConfig.getLogo(payChannel));
        }
        return QrCodeUtil.generateAsBase64(content, qrConfig, ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 重载generate方法，当不指定支付渠道时生成二维码
     *
     * @param content 二维码包含的内容
     * @return 二维码的Base64编码字符串
     */
    @Override
    public String generate(String content) {
        return generate(content, null);
    }
}

